package com.xyz.lockAndList;

import org.junit.Test;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @author 肖咉卓
 *
 * 题目：请举例说明集合类时不安全的
 *
 * 1.故障原因
 * java.util.ConcurrentModificationException
 *
 * 2.导致原因
 *
 * 3.解决方案
 *   3.1  new Vector<>(); 用这个集合（不能用，不推荐）
 *   3.2  Collections.synchronizedList(new ArrayList<>()); 转换成安全的集合
 *   3.3  CopyOnWriteArrayList<>();
 *
 * 4.优化建议（同样的错误，不出现第二次）
 *
 */
public class NotSafeDemo {
    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        NotSafeDemo notSafeDemo=new NotSafeDemo();
        notSafeDemo.hashMap();
    }

    /**
     * list
     */
    public void listDemo(){
        //Collections.synchronizedList(new ArrayList<>());//new Vector<>();//
        List<String> list =new CopyOnWriteArrayList<>();

        for (int i=1 ;i <= 30;i++){
            new Thread(() ->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }

    /**
     * set
     */
    public void set(){
        Set<String> set = new CopyOnWriteArraySet<>();
        for (int i=1 ;i <= 30;i++){
            new Thread(() ->{
                set.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(set);
            },String.valueOf(i)).start();
        }
    }

    /**
     * hashMap
     */

    public void hashMap(){

        Map<String,String> map = new ConcurrentHashMap<>(); // new HashMap<>();
        for (int i=1 ;i <= 30;i++){
            new Thread(() ->{
                map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8));
                System.out.println(map);
            },String.valueOf(i)).start();
        }
    }

}
